﻿#define _CRT_SECURE_NO_WARNINGS
//用第三个中间变量帮助两个数交换值
//#include<stdio.h>
//int main()
//{
//	int a = 8; int b = 10;
//	int temp;
//	temp = b;
//	b = a;
//	a = temp;
//	printf("a=%d,b=%d", a, b);
//}
//不允许创建临时变量，交换两个数的内容

//用异或的方法 1、0异或任何数＝任何数
//2、1异或任何数 = 任何数取反
//3、任何数异或其本身 = 0
//例如：0^0=0 ,1 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 1 = 0
/*按位异或常用于
（1）将二进制数字某几个特定的位置翻转，只需要将该数字与一个特定位置为1，其他位置为0的数字按位异或。例如：
10011011第一第二位翻转，则将它和00000011按位异或，得到10011000
（2）实现两个值交换，利用按位异或的性质
*/
//#include<stdio.h>
//int main()
//{
//	int a = 10;
//	int b = 5;
//	a = a ^ b;//将他们的二进制数按位异或赋给a
//	b = a ^ b;//a按位异或后 再和b按位异或得到a
//	a = a ^ b;//a按位异或后 再和得到a的值的b 按位异或,赋给a
//	printf("a=%d,b=%d\n", a, b);
//}


//3.求10 个整数中最大值。
//#include<stdio.h>
//int main()
//{
//	int i, a[10], MAX;
//	printf("请输入十个整数\n");
//	for (i = 0; i < 10; i++)
//	{
//		scanf("%d", &a[i]);
//	}
//	 MAX = a[0];
//	for (i = 1; i < 10; i++)
//	{
//		if (a[i] > MAX)
//		{
//			MAX = a[i];
//		}	
//	}
//        printf("最大值为：%d", MAX);
//		return 0;	
//}



//4.将三个数按从大到小输出。比较大小，交换位置
//#include<stdio.h>
//int main()
//{
//	int i, a[3],temp;
//	printf("输入三个数\n");
//	for (i = 0; i < 3; i++)
//	{
//		scanf("%d", &a[i]);
//	}
//	if (a[0] < a[1])
//	{
//		temp = a[1];
//		a[1] = a[0];
//		a[0] = temp;
//	}
//	if (a[0] < a[2])
//	{
//		temp = a[2];
//		a[2] = a[0];
//		a[0] = temp;
//	}
//	if (a[1] < a[2])
//	{
//		temp = a[2];
//		a[2] = a[1];
//		a[1] = temp;
//	}
//	printf("%d,%d,%d", a[0], a[1], a[2]);
//	return 0;
//}



//5.求两个数的最大公约数。
//#include<stdio.h>
//int main()
//{
//	
//}






//输出1-100的奇数
//#include<stdio.h>
//int main()
//{
//	int i;
//	for (i = 1; i < 101; i++)
//	{
//		if (i % 2 == 1)//优秀写法为 if( 1 == i % 2)
//		{
//			printf("%d  ", i);
//		}
//	}
//		return 0;
//}





//计算n的阶乘
//#include<stdio.h>
//int main()
//{
//	int i = 0;
//	int n=0;
//	int sum = 1;
//	scanf("%d", &n);
//	for (i = 1; i < n + 1; i++)
//	{
//		sum = sum * i;
//	}
//	printf("n的阶乘为：%d", sum);
//}





//计算1！+2！+...+n！
//#include<stdio.h>
//int main()
//{
//	int i = 0,n=0;
//	int ret = 1;
//	int sum = 0;
//	scanf("%d", &n);
//		for (i = 1; i < n+1 ; i++)
//		{
//			ret = ret * i;
//			sum = sum + ret;
//		}
//		printf("和为：%d", sum);
//}
//用两层for循环完成,不用输入n，直接求1！+2！+3！的值
//#include<stdio.h>
//int main()
//{
//	int i = 0, n = 0;
//	int ret = 1;
//	int sum = 0;
//	for(n=1;n<=3;n++)
//	{ 
//		ret = 1;//每次ret都要置1，要不然ret就是上轮循环的值
//		for (i = 1; i < n + 1; i++)
//		{	
//			ret = ret * i;
//		}
//		sum = sum + ret;
//	}
//		
//		printf("和为：%d", sum);
//}




//用折半查找
//#include<stdio.h>
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//定义数组存放数据
//	int k = 3;//要查找的数值为7
//	int sz = sizeof(arr) / sizeof(arr[0]);//数值元素个数
//
//	int left = 0, right = sz - 1;//left和right代表下标，右下标用数组元素个数减1
//	//int mid = (left +right)/2;错误的，int mid应该放在while里面
//	while (left <= right)
//	{
//		int mid = (left + right) / 2;//放while里 mid求了不止一次，而放外面mid只求了一次
//		if (arr[mid] < k)//一定要用arr[]，arr[k]代表值，而单独的k代表下标
//		{
//			left = mid + 1;
//		}
//		else if (arr[mid] > k)
//		{
//			right = mid - 1;
//		}
//		else
//		{
//			printf("找到了，下标为：%d",mid);
//			break;
//		}
//		
//	}
//	if (left > right)
//	{
//		printf("找不到");
//	}
//	return 0;
//}









//编写代码，演示多个字符从两端移动，向中间汇聚
//#include<string.h>
//#include<windows.h>
//#include<stdio.h>
//int main()
//{
//	char arr1[] = "welcome to xie hui ji hearts";
//	char arr2[] = "############################";
//	int left = 0;
//	int right = strlen(arr1) - 1;
//	while (left <= right)
//	{
//		arr2[left] = arr1[left];
//		arr2[right] = arr1[right];
//		printf("%s\n", arr2);
//		Sleep(1000);//每行字出来后延时1000毫秒
//		system("cls");//每行字出来后 清空屏幕
//		left++;
//		right--;
//	}
//	printf("%s\n", arr2);
//	return 0;
//}








//模拟用户登录情景，并且只能登录三次（只允许输入三次密码，如果密码正确则提示登录成功，若三次都输入错误，则退出程序）
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	int i;
//	char password[10] = { 0 };
//	//假设密码为123456
//	for (i = 0; i < 3; i++)
//	{
//		printf("请输入密码：");
//		scanf("%s", password);
//
//		//if (password == "123456");比较多是两个字符串的首地址，而非内容，字符串比较不能用判断符号，应该用字符串比较函数
//		if (strcmp(password, "123456") == 0)//strcmp比较相同 返回值为0，若返回值为0 再与0比较判断是否0或1，若为1则执行if语句，为0则不执行；
//		{
//			printf("密码正确\n");
//			break;
//		}
//		else
//			printf("输出错误\n");
//		
//	}
//		if(i==3)
//		printf("输出三次均错误，退出系统\n");
//		return 0;
//}








//猜数字游戏
//1.自动生成1-100随机数
//2.猜数字
//  a.猜大了 系统提示猜大了，猜小了 系统提示猜小了,直到猜对为止
//  b.猜对了，恭喜结束游戏
//3.可以一直玩，除非退出游戏

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("***********************\n");
	printf("******* 1.play   ******\n");
	printf("******* 2.exit   ******\n");
	printf("***********************\n");
}
void game()
{
	//猜数字游戏实现
	//1.生成随机数
	//rand函数返回了一个0-32767之间的数字
	//时间-时间戳
	int ret = rand()%100+1;//rand取的随机数大，但题目要求1-100,所以%100的余数为0-99，加上1 为1-100
                           //在用rand之前要先调用srand设置随机数的生成器
	 //srand放主函数中(设置一个随机起点)，放main里可只设置一次起点，有利于随机数的变化
	//2.猜数字
	int guess = 0;

		while (1)//死循环地猜
		{
			printf("请输入数字:\n");
			scanf("%d", &guess);

			if (guess < ret)
			{
				printf("猜小了\n");
			}
			else if (guess > ret)
			{
				printf("猜大了\n");
			}
			else
			{
				printf("猜对了\n");
			}
		}
	
}				
int main()
{
	int input = 0;//input为菜单选项
	                                //当srand()中的数字不断变化时，rand取得的随机数才能不断变化，因此取个不断变化的时间作为返回值，即调用time（）时间戳，不想用time（）里的参数，所以传空指针进去
	srand((unsigned int)time(NULL));//time（）返回值为int型，而srand需要unsigned int型，因此强制转换

	do
	{
		menu();
		printf("请选择：\n");
		scanf("%d",&input);
		switch (input)
		{
	    case 1:
			 game();
			 break;
		case 2:
			printf("退出游戏\n");
		    break;
		default:
			printf("输入错误，请重新输入\n");
	  }
	} while (input);//do while结构上来就能玩游戏
	return 0;
}